package enemies.strategy.concretes;

import mapControl.Celda;
import net.datastructures.Edge;
import net.datastructures.NodePositionList;
import net.datastructures.Vertex;
import ED.GraphImp;
import ED.MyVertex;

public class FindMinPathDFS<V, E> {

	protected Object ESTADO = new Object();
	protected Object NOVISITADO = new Object();
	protected Object VISITADO = new Object();

	private NodePositionList<Vertex<V>> path;
	private GraphImp<V, E> graph;

	public FindMinPathDFS(GraphImp<V, E> graph) {
		this.graph = graph;
		path = new NodePositionList<Vertex<V>>();

	}

	@SuppressWarnings("unchecked")
	public NodePositionList<Vertex<V>> obtenerCamino(Vertex<Celda> origen) {
		limpiarGrafo();
		search((MyVertex<V, E>) origen);
		return path;
	}

	private void limpiarGrafo() {
		for (Edge<E> e : graph.edges()) {
			e.put(ESTADO, NOVISITADO);
		}

	}

	@SuppressWarnings("unchecked")
	private void search(MyVertex<V, E> origen) {
		origen.put(ESTADO, VISITADO);
		path.addLast(origen);

		for (Edge<E> camino : origen.getAdjacencyList()) {
			if (camino.get(ESTADO) == NOVISITADO) {
				camino.put(ESTADO, VISITADO);
				MyVertex<V, E> newOrigen = (MyVertex<V, E>) graph.opposite(
						origen, camino);
				search(newOrigen);
				path.addLast(origen);
			}

		}

	}

}
